﻿using NPinyin;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static string[] sit = {"A",
"V",
"kW",
"kVar",
" ",
"kWh",
"kVarh",
"kWh",
"kWh",
"kWh",
"kWh",
"kWh",
"kWh",
"kWh" };
        static string[] name = {"电流",
"电压",
"有功功率",
"无功功率",
"功率因数",
"正向有功表码",
"反向有功表码",
"小时电量",
"日电量",
"月电量",
"年电量",
"小时节能量",
"日节能量",
"月节能量"
 };
        static string[] sname = { "I",
"U",
"P",
"Q",
"PF",
"ImpKwh",
"ExpKwh",
"HourKwh",
"DayKwh",
"MonthKwh",
"YearKwh",
"HourSaveKwh",
"DaySaveKwh",
"MonthSaveKwh"};
        static string[] type = {  "ai",
"ai",
"ai",
"ai",
"ai",
"acc",
"acc",
"ai",
"ai",
"ai",
"ai",
"ai",
"ai",
"ai"};
        static void Main(string[] args)
        {
            var ds = ReadExcel(@"C:\Users\lossa\Documents\工作文档\负控平台\档案信息表.xlsx", "表计信息表", "树结构表");
            List<TreeStruct> tree = (from c in ds.Tables["树结构表"].AsEnumerable()
                                     select new TreeStruct()
                                     {
                                         ID = c["ID"].ToString(),
                                         名称 = c["名称"].ToString(),
                                         父ID = c["父ID"].ToString(),
                                         节点类型 = c["节点类型，0为实表，2为虚表，1为分析对象"].ToString(),
                                         表计ID = c["表计ID"].ToString()
                                     }).ToList();
            List<MeterClass> meters = (from c in ds.Tables["表计信息表"].AsEnumerable()
                                       select new MeterClass()
                                       {
                                           序号 = c["序号"].ToString(),
                                           表计名称 = c["表计名称"].ToString(),
                                           表计类型 = c["表计类型，1为电表"].ToString(),
                                           PTCT = c["PTCT,变比"].ToString(),
                                           表计ID = c["表计ID"].ToString()
                                       }).ToList();

            List<Meter2Struct> res = new List<Meter2Struct>();
            foreach (var item in meters)
            {
                var node = (from c in tree where c.表计ID == item.表计ID select c).ToList();

                string groupName = string.Empty;
                if (node != null && node.Count() > 0)
                {
                    groupName = GetNodeGroup(node.First(), tree, groupName);
                }
                else
                {
                    continue;
                    //groupName = "中心站";
                }
                groupName = groupName.Replace(item.表计名称, "");
                Encoding gb2312 = Encoding.GetEncoding("GB2312");
                string groupNamePY = Pinyin.GetInitials(Pinyin.ConvertEncoding(groupName, Encoding.UTF8, gb2312), gb2312);
                var m = new Meter2Struct()
                {
                    分组 = groupName,
                    名字 = groupNamePY + item.表计名称,
                    用途 = item.表计名称,
                    设备安装地点 = groupName
                };
                res.Add(m);
                for (int i = 0; i < 14; i++)
                {
                    m.Points.Add(new PointStruct()
                    {
                        节点名字 = m.名字 + "-" + name[i],
                        节点标识 = m.名字 + "-" + sname[i],
                        单位 = sit[i],
                        Type = type[i]
                    });
                }
            }
            DataTable dt1 = new DataTable();
            dt1.Columns.Add("名字");
            dt1.Columns.Add("分组");
            dt1.Columns.Add("用途");
            dt1.Columns.Add("安装地点");
            DataTable dtcc = new DataTable();
            dtcc.Columns.Add("节点名字");
            dtcc.Columns.Add("节点标识");
            dtcc.Columns.Add("单位");
            DataTable dtai = new DataTable();
            dtai.Columns.Add("节点名字");
            dtai.Columns.Add("节点标识");
            dtai.Columns.Add("单位");
            foreach (var m in res)
            {
                dt1.Rows.Add(m.名字,m.分组,m.用途,m.设备安装地点);
                foreach (var p in m.Points)
                {
                    if (p.Type == "ai")
                    {
                        dtai.Rows.Add(p.节点名字,p.节点标识,p.单位);
                    }
                    else
                    {
                        dtcc.Rows.Add(p.节点名字, p.节点标识, p.单位);
                    }
                }
            }
            DataSet dss = new DataSet();
            dss.Tables.Add(dt1);
            dss.Tables.Add(dtai);
            dss.Tables.Add(dtcc);
            Dictionary<string, string> test = new Dictionary<string, string>();
            foreach (var tttt in dt1.AsEnumerable())
            {
                test.Add(tttt[0].ToString(), "OK");
            }
        }

        private static string GetNodeGroup(TreeStruct node, List<TreeStruct> tree, string groupName)
        {
            //throw new NotImplementedException();
            if (int.Parse(node.父ID) <= 0)
            {
                return groupName;
            }
            else
            {
                groupName = node.名称 + groupName;
                var parent = (from c in tree where c.ID.Equals(node.父ID) select c).ToList();
                if (parent == null || parent.Count() <= 0)
                {
                    return groupName;
                }
                else
                {
                    return GetNodeGroup(parent.First(), tree, groupName);
                }
            }
        }

        public static DataSet ReadExcel(string path, params string[] tables)
        {
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + path + ";" + "Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            string strExcel = "";
            OleDbDataAdapter myCommand = null;
            DataSet ds = new DataSet();
            foreach (string table in tables)
            {
                strExcel = "select * from [" + table + "$]";
                myCommand = new OleDbDataAdapter(strExcel, strConn);
                myCommand.Fill(ds, table);
            }
            return ds;
        }
    }
    public class TreeStruct
    {
        string _ID;
        string _父ID;
        string _表计ID;
        string _节点类型;
        string _名称;

        public string ID
        {
            get
            {
                return _ID;
            }

            set
            {
                _ID = value;
            }
        }

        public string 父ID
        {
            get
            {
                return _父ID;
            }

            set
            {
                _父ID = value;
            }
        }

        public string 表计ID
        {
            get
            {
                return _表计ID;
            }

            set
            {
                _表计ID = value;
            }
        }

        public string 节点类型
        {
            get
            {
                return _节点类型;
            }

            set
            {
                _节点类型 = value;
            }
        }

        public string 名称
        {
            get
            {
                return _名称;
            }

            set
            {
                _名称 = value;
            }
        }
    }
    public class MeterClass
    {
        string _序号;
        string _表计ID;
        string _表计名称;
        string _表计类型;
        string _PTCT;

        public string 序号
        {
            get
            {
                return _序号;
            }

            set
            {
                _序号 = value;
            }
        }

        public string 表计ID
        {
            get
            {
                return _表计ID;
            }

            set
            {
                _表计ID = value;
            }
        }

        public string 表计名称
        {
            get
            {
                return _表计名称;
            }

            set
            {
                _表计名称 = value;
            }
        }

        public string 表计类型
        {
            get
            {
                return _表计类型;
            }

            set
            {
                _表计类型 = value;
            }
        }

        public string PTCT
        {
            get
            {
                return _PTCT;
            }

            set
            {
                _PTCT = value;
            }
        }
    }

    public class PointStruct
    {
        string _节点标识;
        string _节点名字;
        string _备注;
        string _数据类型;
        string _单位类型;
        string _单位信息;
        string _单位;
        string _服务器扫描速率;
        string _设备范围下限;
        string _设备范围上限;
        string _告警帮助信息;
        string _多态告警;
        string _死区值;
        string _高高;
        string _高;
        string _低;
        string _低低;
        string _变化率;
        string _偏差;
        string _值;
        string _时间戳;
        string _数据品质;
        string _当前告警状态;
        string _type;

        public string 节点标识
        {
            get
            {
                return _节点标识;
            }

            set
            {
                _节点标识 = value;
            }
        }

        public string 节点名字
        {
            get
            {
                return _节点名字;
            }

            set
            {
                _节点名字 = value;
            }
        }

        public string 备注
        {
            get
            {
                return _备注;
            }

            set
            {
                _备注 = value;
            }
        }

        public string 数据类型
        {
            get
            {
                return _数据类型;
            }

            set
            {
                _数据类型 = value;
            }
        }

        public string 单位类型
        {
            get
            {
                return _单位类型;
            }

            set
            {
                _单位类型 = value;
            }
        }

        public string 单位信息
        {
            get
            {
                return _单位信息;
            }

            set
            {
                _单位信息 = value;
            }
        }

        public string 单位
        {
            get
            {
                return _单位;
            }

            set
            {
                _单位 = value;
            }
        }

        public string 服务器扫描速率
        {
            get
            {
                return _服务器扫描速率;
            }

            set
            {
                _服务器扫描速率 = value;
            }
        }

        public string 设备范围下限
        {
            get
            {
                return _设备范围下限;
            }

            set
            {
                _设备范围下限 = value;
            }
        }

        public string 设备范围上限
        {
            get
            {
                return _设备范围上限;
            }

            set
            {
                _设备范围上限 = value;
            }
        }

        public string 告警帮助信息
        {
            get
            {
                return _告警帮助信息;
            }

            set
            {
                _告警帮助信息 = value;
            }
        }

        public string 多态告警
        {
            get
            {
                return _多态告警;
            }

            set
            {
                _多态告警 = value;
            }
        }

        public string 死区值
        {
            get
            {
                return _死区值;
            }

            set
            {
                _死区值 = value;
            }
        }

        public string 高高
        {
            get
            {
                return _高高;
            }

            set
            {
                _高高 = value;
            }
        }

        public string 高
        {
            get
            {
                return _高;
            }

            set
            {
                _高 = value;
            }
        }

        public string 低
        {
            get
            {
                return _低;
            }

            set
            {
                _低 = value;
            }
        }

        public string 低低
        {
            get
            {
                return _低低;
            }

            set
            {
                _低低 = value;
            }
        }

        public string 变化率
        {
            get
            {
                return _变化率;
            }

            set
            {
                _变化率 = value;
            }
        }

        public string 偏差
        {
            get
            {
                return _偏差;
            }

            set
            {
                _偏差 = value;
            }
        }

        public string 值
        {
            get
            {
                return _值;
            }

            set
            {
                _值 = value;
            }
        }

        public string 时间戳
        {
            get
            {
                return _时间戳;
            }

            set
            {
                _时间戳 = value;
            }
        }

        public string 数据品质
        {
            get
            {
                return _数据品质;
            }

            set
            {
                _数据品质 = value;
            }
        }

        public string 当前告警状态
        {
            get
            {
                return _当前告警状态;
            }

            set
            {
                _当前告警状态 = value;
            }
        }

        public string Type
        {
            get
            {
                return _type;
            }

            set
            {
                _type = value;
            }
        }
    }
    public class Meter2Struct
    {
        string _名字; string _分组; string _用途; string _设备安装地点;
        List<PointStruct> points = new List<PointStruct>();
        public string 名字
        {
            get
            {
                return _名字;
            }

            set
            {
                _名字 = value;
            }
        }

        public string 分组
        {
            get
            {
                return _分组;
            }

            set
            {
                _分组 = value;
            }
        }

        public string 用途
        {
            get
            {
                return _用途;
            }

            set
            {
                _用途 = value;
            }
        }

        public string 设备安装地点
        {
            get
            {
                return _设备安装地点;
            }

            set
            {
                _设备安装地点 = value;
            }
        }

        public List<PointStruct> Points
        {
            get
            {
                return points;
            }
        }
    }
}
